import json

def tools_call(client , message , response_message ,available_functions ):
    tool_calls = response_message.tool_calls
    # 第1步： 检查模型是否需要调用一个函数 -> 如果GPT决定了要掉函数时，此时返回的结果content为none，等待调用函数结果后给出综合结果
    if tool_calls:
        # 第2步: 调用函数 --》 注意GPT可以帮助判断是否要调用函数，但是实际的函数调用还是我们自己去完成
        # 因为可能有很多函数调用，要将所有可能调用的函数定义出来，用于后续判断GPT掉的是哪一个，从而来进行调用

        # 将GPT的回复加入到消息中，作为上下文
        message.append(response_message)
        # 第3步: 将每一个函数调用及其相应的响应发送给模型
        for tool_call in tool_calls:
            # 通过tool_call.function.name 来判断调用的是那个函数,为什么不直接使用function_name变量进行函数调用，防止GPT要调用的函数出错，不是我们定义的
            function_name = tool_call.function.name
            function_to_call = available_functions[function_name]
            if function_to_call:
                # 调用函数
                function_args = json.loads(tool_call.function.arguments)
                # 调用函数并传指定参数
                function_response = function_to_call(function_args)
                message.append(
                    {
                        "tool_call_id": tool_call.id,  # 函数返回的ID
                        "role": "tool",  # role 类型为tool
                        "name": function_name,  # 动态解析的函数调用名，即回调函数
                        "content": function_response,  # 内容为函数调用返回结果
                    }
                )
            # 4、模型理解函数返回的响应后，并返回一个新的响应
            second_response = client.chat.completions.create(
                model="gpt-3.5-turbo-0125",
                messages=message,
            )
        return second_response.choices[0].message.content